package com.hyper_yang.javase.supplement;

public class BitwiseOperation { // 运算用补码
    public static void main(String[] args) {
        // << 左移
        System.out.println(4); // 0100
        System.out.println(4 << 1); // 1000
        System.out.println(4 << 2); // 0001 0000
        System.out.println("======================");

        // >> 右移    正数空缺位补 0   负数空缺位补 1
        System.out.println(4); // 0100
        System.out.println(4 >> 1); // 0010
        System.out.println(4 >> 2); // 0001
        System.out.println(4 >> 4); // 0000
           // 原 1000 0100 反 1111 1011 补 1111 1100
        System.out.println(-4 >> 1); // 补: 1111 1100 >> 1 -> 1111 1110
           // 补 1111 1110 反 1000 0001 原 1000 0010 -> -2 【输出】
        System.out.println("======================");

        // >>> 无符号右移  空缺位补 0
        // 1000 0000 0000 0000 0000 0000 0001 0000 -> -16
        // 1111 1111 1111 1111 1111 1111 1110 1111
        // 1111 1111 1111 1111 1111 1111 1111 0000 -> -16
        System.out.println(0b10000000000000000000000000010000); // -2147483632
        System.out.println(0b00000000000000000000000000010000); // 16
        System.out.println(0b11111111111111111111111111110000); // -16
        System.out.println(-16 >>> 1);
        System.out.println(0b01111111111111111111111111111000);

        System.out.println("======================");

        /* 5 & 3
            1 0 1
            0 1 1
                  &
           --------
            0 0 1  = 1
         */
        System.out.println((5 & 3));

        /* 5 | 3
            1 0 1
            0 1 1
                  |
           --------
            1 1 1  = 7
         */
        System.out.println((5 | 3));

        /* 5 ^ 3 【异或】
            1 0 1
            0 1 1
                  ^
           --------
            1 1 0  = 6
         */
        System.out.println((5 ^ 3));

        /* ~ 5  【取反】
            0000 0101  + 5
            1111 1010  - 6
         */
        System.out.println( ~5 );

        /*
       -5   1000 0101 原码
            1111 1010 反码
            1111 1011 补码
        3   0000 0011 原、反、补

            1111 1011
            0000 0011
                      &
            ------------
            0000 0011  = 3
         */
        System.out.println(-5 & 3);
    }
}
